﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
using System.Reflection;

namespace Dijkstra_Belman_Ford
{
    public partial class SimulateAndWrite : Form
    {
        bool czyUkonczono;
        GraphSimulationInfo[] dataDijkstra;
        GraphSimulationInfo[] dataBellmanFord;
        public SimulateAndWrite()
        {
            InitializeComponent();
            czyUkonczono = false;
        }

        private void btnSimulate_Click(object sender, EventArgs e)
        {
            czyUkonczono = false;
            Graf g;

            lblStatus.Text = "W trakcie...";
            lblStatus.ForeColor = Color.DarkCyan;
            lblStatus.Refresh();

            int from = (int)From.Value;
            int to = (int)To.Value;
            int interwal = (int)Interwal.Value;
            int liczbaKrawedzi;
            int ktory = 0;
            dataDijkstra = new GraphSimulationInfo[((to - from) / interwal)];
            dataBellmanFord = new GraphSimulationInfo[((to - from) / interwal)];
            int coIleProgressBar = 100 / dataDijkstra.Length;

            for (int i = from; i < to; i++)
            {
                //dla sredniej-malej ilosci krawedzi
                //(max - i) - zakres mozliwej liczby krawedzi
                //i * (i-1) - maksymalna liczba krawedzi

                liczbaKrawedzi = i + ((i * (i - 1)) - i) / 4;
                g = FormGenerate.GenerateGraph(i, liczbaKrawedzi);
                g.Dijkstry();
                g.Bellman_Ford();
                dataBellmanFord[ktory] = new GraphSimulationInfo(g.sw1.ElapsedMilliseconds, liczbaKrawedzi, i);
                dataDijkstra[ktory] = new GraphSimulationInfo(g.sw2.ElapsedMilliseconds, liczbaKrawedzi, i);

                //dla sredniej-duzej ilosci krawedzi

                liczbaKrawedzi = i + 3 * ((i * (i - 1)) - i) / 4;
                g = FormGenerate.GenerateGraph(i, liczbaKrawedzi);
                g.Dijkstry();
                g.Bellman_Ford();
                dataBellmanFord[ktory + 1] = new GraphSimulationInfo(g.sw1.ElapsedMilliseconds, liczbaKrawedzi, i);
                dataDijkstra[ktory + 1] = new GraphSimulationInfo(g.sw2.ElapsedMilliseconds, liczbaKrawedzi, i);
                ktory += 2;
                progressBar1.Value += coIleProgressBar;
            }

            progressBar1.Value = 100;

            lblStatus.Text = "Ukończono";
            lblStatus.ForeColor = Color.Green;
            lblStatus.Refresh();

            czyUkonczono = true;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (!czyUkonczono)
            {
                SaveFileDialog saveFD = new SaveFileDialog();
                saveFD.Filter = "Excel Files|*.xlsx";

                if (saveFD.ShowDialog() == DialogResult.OK)
                {
                    dataDijkstra = new GraphSimulationInfo[3];
                    dataBellmanFord = new GraphSimulationInfo[3];
                    for (int i = 0; i < 3; i++)
                    {
                        dataDijkstra[i] = new GraphSimulationInfo();
                        dataBellmanFord[i] = new GraphSimulationInfo();
                    }
                    dataBellmanFord[0].czas = 100;
                    dataBellmanFord[0].liczbaKrawedzi = 150;
                    dataBellmanFord[0].liczbaWierzcholkow = 200;
                    dataBellmanFord[1].czas = 1000;
                    dataBellmanFord[1].liczbaKrawedzi = 1500;
                    dataBellmanFord[1].liczbaWierzcholkow = 2000;
                    dataBellmanFord[2].czas = 10000;
                    dataBellmanFord[2].liczbaKrawedzi = 15000;
                    dataBellmanFord[2].liczbaWierzcholkow = 20000;

                    dataDijkstra[0].czas = 30;
                    dataDijkstra[0].liczbaKrawedzi = 40;
                    dataDijkstra[0].liczbaWierzcholkow = 500;
                    dataDijkstra[1].czas = 300;
                    dataDijkstra[1].liczbaKrawedzi = 400;
                    dataDijkstra[1].liczbaWierzcholkow = 500;
                    dataDijkstra[2].czas = 3000;
                    dataDijkstra[2].liczbaKrawedzi = 4000;
                    dataDijkstra[2].liczbaWierzcholkow = 5000;

                    GraphSimulationInfo.ArrayToExcel(dataDijkstra, dataBellmanFord, saveFD.FileName);
                }

            }
            else
            {
                MessageBox.Show("Nie wykonano symulacji, więc nie ma co zapisać", "Uwaga!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}
